package com.itHsuSE.experiment;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;

public class Experiment5 extends JFrame {
    private JLabel idLab; // 用户编号标签
    private JLabel nameLab; // 用户姓名标签
    private JTextField idInput; // 用户编号输入框
    private JTextField nameInput; // 用户姓名输入框
    private JButton positiveBtn; // 确认按钮
    private JButton deleteBtn; // 删除按钮
    private JButton showBtn; // 显示按钮
    private JTextArea info; // 多行文本区域，用于显示用户信息
    private Map<String, User> userList; // 使用 Map 存储用户对象，以用户ID作为键

    public Experiment5() {
        // 初始化布局
        setTitle("用户信息管理"); // 设置窗口标题
        setVisible(true); // 设置窗口可见
        setSize(400, 200); // 设置窗口大小，宽度为400像素，高度为200像素
        setLayout(new FlowLayout()); // 使用流式布局管理器
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口关闭操作为退出应用程序

        // 初始化控件
        idLab = new JLabel("用户编号"); // 创建用户编号标签
        nameLab = new JLabel("用户姓名"); // 创建用户姓名标签
        idInput = new JTextField(15); // 创建用于输入用户编号的文本框
        nameInput = new JTextField(15); // 创建用于输入用户姓名的文本框
        info = new JTextArea(10, 30); // 创建多行文本显示区域
        info.setLineWrap(true); // 允许文本自动换行
        positiveBtn = new JButton("确认"); // 创建确认按钮
        deleteBtn = new JButton("删除"); // 创建删除按钮
        showBtn = new JButton("显示"); // 创建显示按钮
        userList = new HashMap<>(); // 使用 HashMap 存储用户对象

        // 添加控件到窗口
        add(idLab);
        add(idInput);
        add(nameLab);
        add(nameInput);
        add(positiveBtn);
        add(deleteBtn);
        add(showBtn);
        add(new JScrollPane(info)); // 使用滚动窗格包装文本区域

        // 设置确认按钮点击事件
        positiveBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String name = nameInput.getText();
                String id = idInput.getText();
                // 判断输入是否为空
                if (name.isEmpty() || id.isEmpty()) {
                    info.setText("输入不能为空，请重新输入");
                }
                // 检查输入格式
                else if (!isValidUserId(id)) {
                    info.setText("格式不对！");
                } else {
                    info.setText("欢迎你，" + name + "用户");
                    User user = new User(name, id);
                    userList.put(id, user); // 使用用户ID作为键，将用户对象放入 Map
                }
            }
        });

        // 设置删除按钮点击事件
        deleteBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String id = idInput.getText();
                String name = nameInput.getText();
                // 判断输入是否为空
                if (id.isEmpty() || name.isEmpty()) {
                    info.setText("用户ID和姓名不能为空，请重新输入");
                } else if (userList.containsKey(id)) {
                    User user = userList.get(id);
                    if (user.getName().equals(name)) {
                        userList.remove(id); // 根据用户ID删除用户
                        info.setText("删除成功");
                    } else {
                        info.setText("用户ID和姓名不匹配");
                    }
                } else {
                    info.setText("未找到用户ID：" + id);
                }
            }
        });

        // 设置显示按钮点击事件
        showBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                StringBuilder userInfos = new StringBuilder("用户列表:\n");
                for (User user : userList.values()) {
                    userInfos.append(user.toString()).append("\n");
                }
                info.setText(userInfos.toString());
            }
        });
    }

    public static void main(String[] args) {
        // 使用 SwingUtilities.invokeLater() 来确保 GUI 界面的创建和初始化在事件分派线程中执行，以确保线程安全
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                // 在事件分派线程中创建 Experiment5 对象
                new Experiment5();
            }
        });

    }

    // 自定义的编号校验规则
    private boolean isValidUserId(String userId) {
        return userId.startsWith("2019");
    }
}
